import math


def cot(theta):
    '''定义cot运算'''
    return math.cos(theta) / math.sin(theta)


def calculationQ(a, m, density, alpha):
    '''
        方法：计算压煤量
        参数：A——煤柱平均面积，m²
            m——煤层厚度，m
            density——煤层质量密度，t/m²
            alpha——煤层倾角，°
        return：Q——压煤量
    '''
    Q = a * m * density / math.cos(alpha)
    return Q


def cotSkimming(angel, theta, delta):
    '''计算斜交剖面上下山移动角'''
    cotPie = math.sqrt(cot(angel) * cot(angel) * math.cos(theta) * math.cos(theta) + cot(delta) * cot(delta) * math.sin(
        theta) * math.sin(theta))
    return cotPie


def upLineLength(hi, h, alpha, theta, beta, gamma, delta):
    '''
        function：计算上山方向垂线长度
        hi:即Hi，各角点出的煤层埋深，m
        h：松散层厚度，m
        alpha：煤层倾角
        theta:松散层受护面积边界与煤层走向所夹的锐角
        beta：下山移动角
        gamma：上山移动角
        delta：走向移动角

    '''
    cotB = cotSkimming(beta, theta, delta)
    # cotR = cotSkimming(gamma, theta, delta)
    q = (hi - h) * cotB / (1 + cotB * math.tan(alpha) * math.cos(theta))
    return q


def downLineLength(hi, h, alpha, theta, beta, gamma, delta):
    '''
        function:计算下山方向垂线长度
        hi:即Hi，各角点出的煤层埋深，m
        h：松散层厚度，m
        alpha：煤层倾角
        theta:松散层受护面积边界与煤层走向所夹的锐角
        beta：下山移动角
        gamma：上山移动角
        delta：走向移动角

    '''
    # cotB = cotSkimming(beta, theta, delta)
    cotR = cotSkimming(gamma, theta, delta)
    l = (hi - h) * cotR / (1 - cotR * math.tan(alpha) * math.cos(theta))
    return l
